這是目前我們理解的 HTTP 協定。
今天會詳細說明 Rails 是怎麼處理一個 HTTP Request。
當我們在瀏覽器輸入一個網址時,會發出一個 Get Request 到網頁伺服器。網頁伺服器會根據這個網址,決定他應該要幹嘛。而 Rails 中的 Route 負責分析網址, Route 會決定要把 Request 發給哪一個 Controller 的 Action 來做回應。因為 Action 畫上去圖會很亂,所以就乾脆不畫了。
應該很難懂吧?
用人話來說:Route 就像大樓警衛,當有信件送進來,他要負責把信交給對應的住戶,所以 Controller 就是住家,Action 就是裡面的人。
當然,一棟大樓會有一間警衛室,以及有很多住戶,而且每一戶裡面還有住很多人,但是一封信只會寄給一個人。
先打開 sublime text,然後點左上角的 File
(檔案)。
選擇 Open Folder...
(打開資料夾),選到我們的專案資料夾:D:\只要有心,人人都可以作卡米狗\ironman
。
按下選擇資料夾
。
左側多了一塊是資料夾目錄,那個灰色邊界是可以拖曳的,像這樣:
如果覺得空間不夠大,可以自行調整。
我們的警衛室在 config/routes.rb
,先點左側的 config
資料夾,點一下會展開,再點一下會收合,然後再點一下 routes.rb
。
這樣就是空的。
住戶在 app/controllers
。
看到一個 concerns 空的資料夾和一個 application_controller.rb,現階段就當作沒看到這個檔案好了。
所以我們現在蓋的樓裡面根本沒住人!總之還是先弄個住戶進去再說。
先開啟 cmd 到我們的專案目錄:
D:\只要有心,人人都可以作卡米狗\ironman>
輸入 rails generate controller kamigo
,請 rails 幫我們生成一個叫做 kamigo 的 controller。
D:\只要有心,人人都可以作卡米狗\ironman>rails generate controller kamigo
create app/controllers/kamigo_controller.rb
invoke erb
create app/views/kamigo
invoke test_unit
create test/controllers/kamigo_controller_test.rb
invoke helper
create app/helpers/kamigo_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/kamigo.coffee
invoke scss
create app/assets/stylesheets/kamigo.scss
D:\只要有心,人人都可以作卡米狗\ironman>
他幫我們產生了好多檔案,開頭有 create 的那些都是,但是其實我們只需要 app/controllers/kamigo_controller.rb
。
我們可以用 rails destroy controller kamigo
來刪除這些檔案。
D:\只要有心,人人都可以作卡米狗\ironman>rails destroy controller kamigo
remove app/controllers/kamigo_controller.rb
invoke erb
remove app/views/kamigo
invoke test_unit
remove test/controllers/kamigo_controller_test.rb
invoke helper
remove app/helpers/kamigo_helper.rb
invoke test_unit
invoke assets
invoke coffee
remove app/assets/javascripts/kamigo.coffee
invoke scss
remove app/assets/stylesheets/kamigo.scss
D:\只要有心,人人都可以作卡米狗\ironman>
在左側的 controllers
目錄上按右鍵。
選 New File
。
在新的檔案裡填入我們想要的程式碼:
class KamigoController < ApplicationController
end
然後按下 Ctrl
+S
存檔。
輸入檔名:kamigo_controller.rb
,副檔名 .rb
是 ruby 的意思,這樣 sublime text 就能知道內文是 ruby 程式碼。
自從我用了 sublime text 之後,人生就變成彩色的呢!
前面有提到 controller 是一戶,每一戶裡面還要有人,所以我們弄點人進去。
我們定義一個叫做 eat
的空方法。
class KamigoController < ApplicationController
def eat
end
end
注意看這裡:
他是一個灰色圈圈,代表這個檔案編輯過,但還沒存檔,按下 Ctrl
+S
之後就會變成灰色X,像這樣:
現在我們已經有一戶,而且住了一個人了,我們來請警衛幫我們轉信。
我們把 config/routes.rb
改成這樣:
Rails.application.routes.draw do
get '/kamigo/eat', to: 'kamigo#eat'
end
get '/kamigo/eat', to: 'kamigo#eat'
的意思是當有人在瀏覽器輸入網址 /kamigo/eat
時,就把請求交給 kamigo 這個 controller 裡的 eat 方法來回應。
在 cmd 輸入 rails s
開啟網頁伺服器:
D:\只要有心,人人都可以作卡米狗\ironman>rails s
=> Booting Puma
=> Rails 5.1.4 application starting in development
=> Run `rails server -h` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 3.11.0 (ruby 2.4.2-p198), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
用瀏覽器開啟這個網址:http://localhost:3000/kamigo/eat,然後就爆炸了:
是一個很眼熟的爆炸,這招我們在第九天:作一個最簡單的 Rails 網站就玩過了。這是因為 Rails 找不到對應的 html 檔案,所以爆炸。可是我們並沒有在 eat 裡面要求 Rails 去找檔案呀!原來這是 Rails 的預設行為。要修好這個問題有兩個方法:
兩種我們都要會。
網頁應該要放在 app/views/kamigo/
下,檔名需要叫做 eat.html
或者 eat.html.erb
。
在 sublime text 新增資料夾的方法是在 views
資料夾點右鍵:
點選 New Folder...
:
輸入 kamigo
後按 Enter
,資料夾就新增完成了。如果你不喜歡這樣,你也可以回到檔案總管去新增資料夾。
然後新增 eat.html
檔案,在裡面寫你想要吃的東西。
再開一次網址看他有沒有修好:http://localhost:3000/kamigo/eat
修好了!
把 app/controllers/kamigo_controller.rb
檔案改成下面的內容後存檔:
class KamigoController < ApplicationController
def eat
render plain: "吃土啦"
end
end
我們加入了一行程式碼 render plain: "吃土啦"
,意思是我們要用純文字"吃土啦"
來回應這個請求,這樣 Rails 就不會用預設的網頁路徑作為回應了。
再開一次網址看他有沒有變化:http://localhost:3000/kamigo/eat。
卡米狗好兇阿。
明天我們要從 Rails 的角度觀察 HTTP 協定。
第14天render plain: "吃土啦"這步驟測試出了問題但不知哪裡有問題
https://imgur.com/a/ftRik
class 名稱的大小寫有問題
原來是這樣謝謝您
另外這問題
他說找不到 DennisaController
大大我第十三點報錯了 可以幫我看一下嗎 謝謝您
試試看安裝 node.js: https://nodejs.org/en/
進網頁後點左邊的 TLS 版本
謝謝 正常了
好哦~好哦~
大大我想請問一下
我也在13點報錯
我有爬文去下載node.js
但是我搞不清楚這兩者有什麼關連
所以我的狀況依然沒有解除
附上我的伺服器LOG
你的 ohController 改成 OhController 應該就行了。
因為類別名稱必須是 CONSTANT,而 CONSTANT 必須是首字大寫。
CONSTANT 是常數的意思。
謝謝大大的解釋 這個debug我有發現 但是我還是失敗 我明天從新做一次再來報告
備註:但是吃土那個我有做出來
加油~
報告大大!!!
我重新啟動伺服器他就好了耶....
我想要請問一下
如果routes內有更動
是不是要重新啟動服務才會生效?
我昨天看他那個LOG感覺起來就是路由表的修改沒有套用
對
報告大大 確認過發現安裝玩node.js後
電腦必須重新啟動 才會套用!
請問要怎麼讓它顯示預設的view裡面的layout呢?
我設定routes都會報錯
我設定的是這樣 '/morningdog', to: 'application#application'
你遇到的錯誤訊息是什麼呢?
他報這樣的錯給我~
不懂錯在哪裡
求大神解答
忘了附上網頁截圖
使用的名稱是chat_bot_alpha
我發現我一直漏截圖QAQ
試試看安裝 node.js: https://nodejs.org/en/
進網頁後點左邊的 TLS 版本
然後重新啟動 raills server
少node.js無法正常執行?
p.s.我是那種準備好東西才看教學的人
哦...似乎一樣慘
重開機就搞定了
竟然需要重開機@@
我卡關了請大神求解
無法產生 Controller 資料,之前伺服器也無法從電腦開啟...
可以看一下你的 config/database.yml
和 gemfile
這兩個檔案的內容嗎?
大大~我找到方法了
原來我一開始就安裝錯Ruby的版本
我安裝到2.5版本一直產生錯誤解決不了
後來我再重新安裝2.4版本就好了
感謝
cool
在吃麥當勞的那個步驟開始出錯了
https://i.imgur.com/cLIL1ba.png
Error
raise LoadError, "Unable to autoload constant #{qualified_name}, expected #{file_path} to define it" unless from_mod.const_defined?(const_name, false)
貼一下你的程式碼
我這邊解決了 不好意思!
如果還有問題我會再問你
目前進度是在16天
請問SyntaxError是甚麼問題
https://i.imgur.com/P9li0yS.png
語法錯誤,應該是 K 沒大寫
真的是沒大寫,找超久
請問版主,我已經重試很多次 但是網頁開出來都是這樣 麻煩幫忙解答
謝謝
class 的名稱第一個字要大寫哦
我也卡在這裡好久,原來第一個字要大寫!
感謝!
您好
我在"做一個 Controller"
這個步驟產生問題
請問如何解決?
你打錯字囉
噗!原來
糗XD
又遇到問題了@@
新增網頁後,沒修復問題
承上再附上文字編輯器其他頁面
routes.rb 修改後 rails server 要重啓
我整個重開機,再重啟
發現無法啟動,不知道甚麼原因..
有人可幫忙解答嗎
呃......
以上,能幫忙解惑嘛?
在 controller 的名字當中使用到大寫 B 導致錯誤,建議全部改為小寫,包含你的 doubleB_controller.rb 檔名的部分
不知道有沒有人也正卡關在**「在正確的地方新增網頁」**
小魯資質愚鈍在那遇到Template error & Uninitialized error鬼打牆了半小時
在此寫下筆記,希望能幫助其他初學者
get '/kamigo/eat' , to: 'kamigo#eat'
其中後半段的 to
第一個kamigo指的是資料夾的direction,也是存放eat.html (或eat.html.erb)的資料夾
請注意資料夾命名不要加入底線( _ ),會讀不到
加了底線在資料夾名字當中你會像我一樣鬼打牆很久
第二段eat就如同上述,就是你紀載文字的html / html.erb檔案
另外留言區也有前輩討論過了controller.rb裡面的class命名問題
class kamigoController < ApplicationController
↑會error,因為class命名要用大寫字母作為開頭
因此改成
class KamigoController < ApplicationController
就可以避免遇到同樣的問題
若有誤還請指教Orz